package files

import (
	"gitee.com/kitfast/device-protocol/device"
	"gitee.com/kitfast/device-protocol/hashes"
)

// 文件同步流程（专指主控端向设备端同步文件）：
// 1. 主控端向设备端发送 file-sync 指令，描述同步信息与文件信息
// 2. 设备端根据 FileInfo.Url 下载文件，保存到 SyncInfo.Path 目录中
//    2.1 [可选]设备端备份或删除设备上的文件
// 3. 设备端向 SyncInfo.Ack 发送成功或失败的确认消息
//    3.1 [可选]如果失败，则还原原先的文件，就像从来没有执行同步指令一样
//    3.2 [可选]设备端可以根据 hash 校验文件

const (
	FILE_SYNC     = "file-sync"     // 指令：主控端向设备端同步文件
	FILE_SYNC_ACK = "file-sync-ack" // 指令：设备端向主控端确认同步成功
)

// 文件信息
type FileInfo struct {
	Id   string `json:"id,omitempty"`   // 文件ID，若无合适的，则可用 URL 作为文件 ID。可设置为空。
	Url  string `json:"url,omitempty"`  // 文件地址，若是本地文件，请使用 file:// 模式。
	Name string `json:"name,omitempty"` // 文件在设备端的存储名称
	Size int    `json:"size,omitempty"` // 文件大小（字节）

	Hashes []*hashes.Hash `json:"hashes,omitempty"` // 文件内容的摘要
}

// 同步信息，一个同步信息就是一个原子操作。设备要么同步成功，要么什么也不做
type SyncInfo struct {
	// 同步确认的地址，如 topic 名。主控端下达同步指令时（file-sync），需要设置。
	// 用于指示设备端把同步完成或同步失败的消息向哪个主题发送。
	Ack   string      `json:"ack,omitempty"`
	Path  string      `json:"path,omitempty"`  // 主控端指示设备端应当把文件存储在什么地方（路径）
	Files []*FileInfo `json:"files,omitempty"` // 文件列表
	// 主控端下达同步指令时（file-sync），无需设置；
	// 设备端向主控端确认同步是否成功时（file-sync-ack），需要设置：
	// 如果设备端同步成功，则设置为空字符串；
	// 如果设备端同步失败，则设备为出错的消息。
	Error string `json:"error,omitempty"`
}

// 文件同步指令
type FileSync struct {
	Command string         `json:"cmd"`
	Device  *device.Device `json:"device"`
	Payload []*SyncInfo    `json:"payload"`
}
